<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>递归的练习(recursive practice)</title>
</head>
<body>

  <script>
    // 1. 求1-100之间所有数的和
    // 1.1. 非递归
    let sum = 0;
    for (let i = 1; i <= 100; i++) {
      sum += i;
    }
    console.log("1. 求1-100之间所有数的和 - 非递归", sum); // 5050

    // 1.2. 递归
    function increase(num) {
      if (num === 1) {
        return 1;
      } else {
        return num + increase(num - 1);
      }
    }
    console.log("1. 求1-100之间所有数的和 - 递归", increase(100)); // 5050

    // 2. 求1-100之间所有偶数的和
    // 2.1. 非递归
    let sum1 = 0;
    for (let i = 1; i <= 100; i++) {
      if (i % 2 === 0) {
        sum1 += i;
      }
    }
    console.log("2. 求1-100之间所有偶数的和 - 非递归", sum1); // 2550

    // 2.2. 递归
    function evenNumberAdd(num) {
      if (num === 1) {
        return 0;
      } else {
        if (num % 2 === 0) {
          return num + evenNumberAdd(num - 1);
        } else {
          return evenNumberAdd(num - 1);
        }
      }
    }
    console.log("2. 求1-100之间所有偶数的和 - 递归", evenNumberAdd(100)); // 2550

    // 3. 求1-100之间所有奇数的和
    // 3.1. 非递归
    let sum2 = 0;
    for (let i = 1; i <= 100; i++) {
      if (i % 2 !== 0) {
        sum2 += i;
      }
    }
    console.log("3. 求1-100之间所有奇数的和 - 非递归", sum2); // 2500

    // 3.2. 递归
    function oddNumberIncrease(num) {
      if (num === 1) {
        return 1;
      } else {
        if (num % 2 !== 0) {
          return num + oddNumberIncrease(num - 1);
        } else {
          return oddNumberIncrease(num - 1);
        }
      }
    }
    console.log("3. 求1-100之间所有奇数的和 - 递归", oddNumberIncrease(100)); // 2500

    // 4. 实现x的n次方法
    // 4.1. 非递归
    function pow(x, n) {
      let sum = 1;
      for (let i = 0; i < n; i++) {
        sum *= x;
      }
      return sum;
    }

    console.log("4. 实现x的n次方法 - 非递归", pow(2, 3)); //  8

    // 4.2. 递归
    function recursionPow(x, n) {
      if (n === 1) {
        return x;
      } else {
        return x * recursionPow(x, n - 1);
      }
    }
    console.log("4. 实现x的n次方法 - 递归", recursionPow(2, 3)); // 8

    // 5. 斐波那契数列
    // 数列: 1 1 2 3 5 8 13 21 34 55  ... x
    // 位置: 1 2 3 4 5 6 7  8  9  10  ... n
    // 5.1. 非递归
    function fibonacci(n) {
      let arr = [1, 1];
      for (let i = 2; i < n; i++) {
        arr[i] = arr[i - 1] + arr[i - 2];
      }
      return arr[n - 1];
    }

    console.log("5. 斐波那契数列 - 非递归", fibonacci(10)); // 55

    // 5.2. 递归
    function recursionFibonacci(n) {
      if (n === 1 || n === 2) {
        return 1;
      } else {
        return recursionFibonacci(n - 1) + recursionFibonacci(n - 2);
      }
    }
    console.log("5. 斐波那契数列 - 递归", recursionFibonacci(10)); // 55

    
  </script>
  
</body>
</html>